home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Suzy B Software 2
/
Suzy B Software CD-ROM 2 (1994).iso
/
prntutil
/
printpar
/
printpar.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1995-04-25
|
12KB
|
368 lines
{$A+,D-,S0}
Program Print;
{$I e:\pascal\include\Gemsubs.pas}
CONST
maxlines = 5;
AC_Open = 40;
BEG_Mctrl = 3;
END_Mctrl = 2;
VAR
working : String[249];
defpath, inpath, linestr, test : STRING;
char_wide, char_height, bch, bcw,
ap_id, menu_id, pagecount, linecount,
counter, title_1, prompt_1, prompt_2,
prompt_3, window, cancel_btn, drive,
rez, choice : INTEGER;
program_name : Str255;
Stop_PRINT, accloop, doneprt : BOOLEAN;
msg : Message_Buffer;
print_dialog : Dialog_Ptr;
PROCEDURE IO_Check( b : BOOLEAN );
EXTERNAL;
FUNCTION IO_Result : INTEGER;
EXTERNAL;
FUNCTION CurDrv : INTEGER;
GEMDOS( $19 );
FUNCTION GetRez : INTEGER;
XBIOS( 4 );
PROCEDURE Obj_Draw ( BOX : Dialog_Ptr; Item : Tree_Index;
DEPTH, X, Y, W, H : INTEGER );
EXTERNAL;
PROCEDURE WIND_Update ( ctrl : INTEGER );
VAR
int_in : Int_In_Parms;
int_out : Int_Out_Parms;
addr_in : Addr_In_Parms;
addr_out : Addr_Out_Parms;
BEGIN
int_in[0] := ctrl;
AES_Call( 107, int_in, int_out, addr_in, addr_out );
END;
{ This procedure is where the accessory waits for a mesaage to activate }
{ and start to print a file. }
PROCEDURE Event_Loop;
VAR
event, dummy : INTEGER;
again : BOOLEAN;
BEGIN
again := FALSE;
REPEAT
event := Get_Event( E_Message,0,0,0,0,FALSE,0,0,0,0,
FALSE,0,0,0,0,msg,
dummy,dummy,dummy,dummy,dummy,dummy );
{ Open up only if "OPEN" message has been received, and the proper menu }
{ identification number is given! }
IF (msg[0] = AC_Open) AND (msg[4] = menu_id) THEN
again := TRUE;
UNTIL again;
END;
{ This procedure converts an INTEGER number into a string }
PROCEDURE Convert( number : INTEGER; VAR tempstr : STRING );
VAR
temp : STRING;
tempnum, count1, count2,
divideby : INTEGER;
first : BOOLEAN;
PROCEDURE Num( whatnum : Integer ; VAR str : string ) ;
CONST
numbers = '123456789';
BEGIN
IF whatnum = 0 THEN
str := '0'
ELSE
str := Copy( numbers, whatnum, 1);
END;
BEGIN
tempstr := '';
first := true;
FOR count1 := maxlines DOWNTO 1 DO BEGIN
divideby := 1;
FOR count2 := 1 TO count1 DO
divideby := divideby*10;
tempnum := number div divideby;
number := number mod divideby;
Num( tempnum, temp );
IF tempnum>0 THEN
first := false;
IF NOT first THEN
tempstr := Concat( tempstr, temp );
END ;
Num( number, temp );
tempstr := Concat( tempstr, temp );
END;
{ This function asks whether you want to stop the printing.... If so, it }
{ returns TRUE to the asking procedure. }
FUNCTION AskStop : Boolean ;
VAR
choice : INTEGER;
str : Str255;
BEGIN
str := '[2][ |Do you wish to STOP printing?][ Yes | No ]';
choice := Do_Alert( str,2 );
IF choice = 1 THEN
AskStop := TRUE
ELSE
AskStop := FALSE
END;
{ This procedure prints one line on the printer. It also then loops back }
{ to GEM to see if either the UNDO key has been pressed, or whether the }
{ left mouse button has been pressed over the "CANCEL" box. If either these }
{ conditions have been met, it then asks you if you want to terminate the }
{ printing. }
PROCEDURE Println( str : Str255 ) ;
VAR
event, what_key, bcnt, bstate,
mx, my, kbd : INTEGER;
BEGIN
event := Get_Event( E_Keyboard|E_Timer|E_Button,
1, 1, 1, 0,
FALSE, 0, 0, 0, 0,
FALSE, 0, 0, 0, 0,
msg, what_key, bcnt,
bstate, mx, my, kbd );
IF (event & E_Keyboard <> 0 ) THEN
IF (NOT Stop_PRINT) AND ((what_key = $6100) OR (what_key = $1C0D)) THEN
Stop_PRINT := AskStop;
IF (event & E_Button <> 0) AND (bcnt>0) AND
(mx > (35*char_wide)) AND
(mx < (45*char_wide)) AND
(my > (16*char_height + char_height DIV 2)) AND
(my < (18*char_height + char_height DIV 2)) AND
(NOT Stop_PRINT) THEN
Stop_PRINT := AskStop ;
IF (NOT Stop_PRINT) THEN BEGIN
IF Length( str ) = 80 THEN
Write( str )
ELSE
Writeln( str );
END;
END;
{ This procedure writes a passed string (numbers is this program) on the }
{ screen in the interactive dialog box. Note that the mouse is hide as the}
{ string is printed. }
PROCEDURE ListMessage( str : Str255 ; pos : INTEGER );
VAR
len, c : INTEGER;
BEGIN
len := Length(str);
IF len < 14 THEN
FOR c := 1 TO 14-len DO
str := Concat( str, ' ' );
Hide_Mouse;
Draw_String( 40*char_wide, (11 + pos)*char_height + char_height DIV 3 + 1,
str );
Show_Mouse;
END;
{ This procedure prints the page header on the top of each new page. }
PROCEDURE Header;
VAR
temp1, temp2 : STRING;
counter : INTEGER;
BEGIN
temp1 := inpath;
Convert( pagecount, temp2 );
ListMessage( temp2, 4 );
FOR counter := 74-Length(temp2) DOWNTO Length(temp1) DO
temp1 := Concat(temp1,' ');
Insert( 'Page ', temp1, 74-Length(temp2) );
Insert( temp2, temp1, 79-Length(temp2) );
Println( temp1 );
Println( '' );
Println( '' );
END;
{ This procedure sets up the items needed for the interactive dialog box }
{ to be drawn. }
PROCEDURE Setup_Dialog;
BEGIN
print_dialog := New_Dialog( 10, 0, 0, 32, 13 );
title_1 := Add_DItem( print_dialog, G_String, None, 5, 1,
22, 1, 0, $1180 );
prompt_1 := Add_DItem( print_dialog, G_String, None, 3, 4,
30, 1, 0, $1180 );
prompt_2 := Add_DItem( print_dialog, G_String, None, 3, 6,
15, 1, 0, $1180 );
prompt_3 := Add_DItem( print_dialog, G_String, None, 3, 8,
15, 1, 0, $1180 );
cancel_btn := Add_DItem( print_dialog, G_BoxText,
Selectable|Default|Exit_Btn, 11, 10, 10, 2, 2, $1180 );
END;
{ This procedure finds the file name in the path to the file to be printed }
{ and concatenates it the the passed string. }
PROCEDURE Add_Path (VAR str : Str255 ) ;
VAR
len, x : INTEGER;
BEGIN
len := Length( inpath );
LOOP
EXIT IF (inpath[ len ] = '\') OR (len = 1);
len := len - 1;
END;
str := ' File Name: ';
FOR x := (len + 1) TO Length( inpath ) DO
str := Concat( str, inpath[ x ] ) ;
END;
{ This procedure first attempts to open up a window the full size fo the }
{ screen. This is necessary to prevent GEM from misdirecting button }
{ presses for the interactive dialog box to the windows beneath the box. }
{ Whether the window is opened successfully or not, the dialog box is then }
{ drawn on the screen. }
PROCEDURE ShowProgress ;
VAR
str : Str255;
BEGIN
Set_DText( print_dialog, title_1,
'Currently PRINTING File', System_Font, TE_Center );
Add_Path ( str );
Set_DText( print_dialog, prompt_1, str, System_Font, TE_Right ) ;
Set_DText( print_dialog, prompt_2,
' Line Count:', System_Font, TE_Right ) ;
Set_DText( print_dialog, prompt_3,
'Page Number:', System_Font, TE_Right ) ;
Set_DText( print_dialog, cancel_btn, 'CANCEL',
System_Font, TE_Center ) ;
Obj_SetState( print_dialog, cancel_btn, Normal, FALSE ) ;
Text_Color( Black ) ;
Center_Dialog( print_dialog ) ;
Obj_Draw( print_dialog, 0, 1, 0, 0, 80*char_wide, 24*char_height ) ;
END;
{ This is the main program. }
BEGIN
program_name := ' Serial File Printer';
ap_id := Init_Gem; { Initialize GEM and register our accessoary }
menu_id := 0;
IF ( ap_id>0 ) THEN { If we are an accessory, add name to Desk menu }
menu_id := Menu_Register( ap_id, program_name );
IF (ap_id >= 0) AND (menu_id >=0) THEN BEGIN
{ Get the current screen characteristics for positioning later }
IF (ap_id>0) THEN
accloop := TRUE { We are an accessory }
ELSE
accloop := FALSE; { We are a program }
Sys_Font_Size( char_wide, char_height, bcw, bch );
rez := GetRez;
IF rez = 0 THEN
char_wide := char_wide DIV 2;
doneprt := TRUE;
REPEAT
IF accloop AND doneprt THEN { If we are an accessory, wait to be selected }
Event_Loop; { Loop until called }
pagecount := 1; { Initialize our page/line counts for printing }
linecount := 1;
choice := 1;
drive := CurDrv; { Find the current drive; If "A" or "B" }
IF drive < 2 THEN { ask the user to insert a diskette }
choice := Do_Alert('[3][ | |Insert Source Disk][ OK | Cancel ]', 1)
ELSE
choice := 1;
IF choice = 1 THEN BEGIN
defpath := 'A:\*.*';
defpath[1] := Chr( Ord(defpath[1]) + drive );
IF Get_In_File( defpath, inpath ) THEN BEGIN { Get the file path }
test := Copy( inpath, Length(inpath), 1 ); { to print }
doneprt := FALSE;
IF test<>'\' THEN BEGIN
IO_check( FALSE ) ; { Find out whether line numbers are to be }
choice := Do_Alert { added, and give one more way to stop prg}
('[2][ |Do you want line numbers?][ No | Yes | Cancel ]',1);
Reset( Input, inpath ) ;
IF ( IO_Result <> 0 ) THEN
choice := 3; { If there is an error }
IF ( choice < 3 ) THEN BEGIN { open, bomb out. }
WIND_Update( BEG_Mctrl ) ; { Stop the screen manager }
Setup_Dialog;
Stop_PRINT := FALSE;
ShowProgress; { Initialize the interactive dialog box }
ListMessage( '1', 2 );
ListMessage( '1', 4 );
Rewrite( Output, 'PRN:' ); { Open the printer for output }
Header; { Print the initial header }
counter := 1;
REPEAT
Readln( working );
IF IO_Result <> 0 THEN
Stop_PRINT := TRUE;
IF (NOT Stop_PRINT) THEN BEGIN
Convert( linecount, linestr );{ Now loop, printing each }
ListMessage( linestr, 2 ); {line, then reading the next }
IF ( choice=2 ) THEN BEGIN {until done, or stop message}
While Length(linestr)<5 DO { received. }
linestr := Concat( linestr, ' ' );
working := Concat( linestr, ' ', working );
END;
Println( working );
linecount := linecount + 1;
counter := counter + (Length(working) DIV 81) + 1;
IF counter>60 THEN BEGIN { Allow 60 lines per page }
pagecount := pagecount+1;
Println( Chr(12) ); { Do a form feed }
Header;
counter := 1;
END;
END;
UNTIL EOF OR Stop_PRINT;
Writeln( Chr(12) ); { End printing with a Form Feed }
Close( Output );
Close( Input );
End_Dialog( print_dialog );
Delete_Dialog( print_dialog );
WIND_Update( END_Mctrl ); { Restart the Screen Manager }
END; { if choice < 3 }
END; { if test <> '\' }
END { if get_in_file }
ELSE
doneprt := TRUE;
END; { if choice = 1 }
UNTIL ((NOT accloop) AND doneprt);
END; { if ap_id }
Exit_GEM; { Exit gem only if we cannot register our accessory. }
END.